package org.mbcorp.sar.validator;

import java.util.Date;
import java.util.List;

import org.mbcorp.sar.model.Fase;
import org.mbcorp.sar.model.Horario;
import org.mbcorp.sar.model.Solicitud;
import org.mbcorp.sar.service.HorarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

@Component
public class SolicitudValidator implements Validator {	
	
	@Autowired
	HorarioService horarioService;
	
	@SuppressWarnings("rawtypes")
	public boolean supports(Class clazz) {
		return Solicitud.class.isAssignableFrom(clazz);
	}

	public boolean validarBusquedaExacta(Object object, Errors errors) {
		Solicitud solicitud = (Solicitud) object;
		if (solicitud.getId() == null) {
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "validation.solicitud.busqueda.noId");
			return false;
		}
		return true;
	}
	
	public boolean validarBusquedaAmplia(Object object, Errors errors){		
		Solicitud solicitud = (Solicitud) object;
		if (solicitud.getFechaBusquedaInicio() == null || solicitud.getFechaBusquedaFin() == null) {
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "fechaBusquedaInicio", "validation.solicitud.busqueda.noFecha");
			return false;
		}
		return true;
	}
	
	public boolean validarRangoFechas(Solicitud s, Errors errors){		
		if ((s.getFechaBusquedaInicio() == null && s.getFechaBusquedaFin() != null) || (s.getFechaBusquedaInicio() != null && s.getFechaBusquedaFin() == null)){
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "fechaBusquedaInicio", "validation.solicitud.busqueda.noFecha");
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "fechaBusquedaFin", "validation.solicitud.busqueda.noFecha");
			return false;
		}
		return true;
	}

	@Override
	public void validate(Object target, Errors errors) {
		this.validarBusquedaAmplia(target, errors);
		}
	
	 public void validarArchivo(Object object, Errors errors) {

		 Solicitud solicitud = (Solicitud) object;

		  if (solicitud.getArchivoAux()== null || solicitud.getArchivoAux().getSize() == 0) {
	          errors.rejectValue("archivo", "validation.solicitud.registro.noArchivo");
		  }
		  
		  if (solicitud.getArchivoAux()== null || solicitud.getArchivoAux().getSize() > 2097152) {
			  errors.rejectValue("archivo", "validation.solicitud.registro.archivoPesado");
		  }

	 }
	 
	 public void validarRegistro(Object object, Errors errors){
			Solicitud solicitud = (Solicitud) object;
			if (solicitud.getFechaEsperada() == null) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "fechaEsperada", "validation.solicitud.registro.noFecha");
			}				
			if (solicitud.getFechaEsperada().before(new Date())) {
				errors.rejectValue("fechaEsperada", "validation.solicitud.registro.noFechaFutura");
			}
			if (solicitud.getDesc1() == null || solicitud.getDesc1().isEmpty()) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "desc1", "validation.solicitud.registro.noDesc1");
			}
			if (solicitud.getDesc2() == null || solicitud.getDesc2().isEmpty()) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "desc2", "validation.solicitud.registro.noDesc2");
			}
			if (solicitud.getDesc3() == null || solicitud.getDesc3().isEmpty()) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "desc3", "validation.solicitud.registro.noDesc3");
			}
			if (solicitud.getDesc4() == null || solicitud.getDesc4().isEmpty()) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "desc4", "validation.solicitud.registro.noDesc4");
			}
			if (solicitud.getDesc5() == null || solicitud.getDesc5().isEmpty()) {
				ValidationUtils.rejectIfEmptyOrWhitespace(errors, "desc5", "validation.solicitud.registro.noDesc5");
			}
		}
	 
	 public boolean tieneProgramaciones(Solicitud solicitud){
		 if(solicitud.getFases().size() == 0){
			 return false;
		 }
		 for(Fase f: solicitud.getFases()){
			 if(f.getHorarios() == null || f.getHorarios().size() == 0){
				 return false;
			 }
		 }
		 return true;
	 }
	 
	 public boolean tieneCruces(Solicitud s){
		 for(Fase fase : s.getFases()){
				for(Horario horario: fase.getHorarios()){
					List<Horario> colisiones = horarioService.buscarTodos(horario.getOperador());
					if(horarioService.tieneColisiones(horario, colisiones)){
						return true;
					}
				}
			}
		 return false;
	 }
}